# -*- coding: utf-8 -*-
"""
    xfree.auth.services.factories
    ~~~~~~~~~~~~~~~~~~~~~
    文件描述：各种xfree认证服务的工厂函数,这些工厂函数是临时的。
    作者：xfree
    邮箱：cy_83k@qq.com
"""

from datetime import timedelta

from flask import current_app

from...extensions import db
from...tokens import XFreeTokenSerializer
from...tokens.verifiers import EmailMatchesUserToken
from...user.models import User
from.activation import AccountActivator
from.authentication import PluginAuthenticationManager
from.password import ResetPasswordService
from.reauthentication import PluginReauthenticationManager
from.registration import RegistrationService


def registration_service_factory():
    """
    创建注册服务的工厂函数

    :return: 一个RegistrationService实例
    """
    return RegistrationService(current_app.pluggy, User, db)


def reset_service_factory():
    """
    创建密码重置服务的工厂函数

    :return: 一个ResetPasswordService实例
    """
    # 创建令牌序列化器，使用当前应用配置中的密钥，并设置有效期为1小时
    token_serializer = XFreeTokenSerializer(
        current_app.config["SECRET_KEY"], expiry=timedelta(hours=1)
    )
    verifiers = [EmailMatchesUserToken(User)]
    return ResetPasswordService(token_serializer, User, token_verifiers=verifiers)


def account_activator_factory():
    """
    创建账户激活器的工厂函数

    :return: 一个AccountActivator实例
    """
    # 创建令牌序列化器，使用当前应用配置中的密钥，并设置有效期为1小时
    token_serializer = XFreeTokenSerializer(
        current_app.config["SECRET_KEY"], expiry=timedelta(hours=1)
    )
    return AccountActivator(token_serializer, User)


def authentication_manager_factory():
    """
    创建认证管理器的工厂函数

    :return: 一个PluginAuthenticationManager实例
    """
    return PluginAuthenticationManager(current_app.pluggy, db.session)


def reauthentication_manager_factory():
    """
    创建重新认证管理器的工厂函数

    :return: 一个PluginReauthenticationManager实例
    """
    return PluginReauthenticationManager(current_app.pluggy, db.session)